#ifndef BOARD_H
#define BOARD_H

#include <stdio.h>

/* Stosuję kota z Cheshire na wypadek */
/* potrzeby zmiany implementacji */

struct Data;

typedef struct Board {

	struct Data* data;
	
} Board;

/* typ wyliczeniowy reprezentujący pole planszy */
typedef enum { EMPTY, CIRCLE, CROSS } symbol;

/* Struktura reprezentuje ruch na planszy */
/* Pas to ruch ze współrzędnymi (-1, -1). */
typedef struct Move {

	int x;
	int y;
	symbol what;
	
} Move;

/* struktura reprezentująca wynik */
typedef struct Result {

	int circleSymbols;
	int crossSymbols;

	int circleGroups;
	int crossGroups;
	
	float circleResult;
	float crossResult;
	
} Result;

/***********************************
 * OPERACJE INICJALIZACJI ITP.     *
 ***********************************/

/* inicjalizacja planszy */
void board_init(Board** b, int n, int k,
                float komiCircle, float komiCross,
                int isCircleComputer, int isCrossComputer);

/* sprzątanie planszy */
void board_cleanup(Board* b);

/* kopiowanie planszy */
Board* board_copy(Board* b);

/***********************************
 * OPERACJE I/O                    *
 ***********************************/

/* odczyt stanu gry z pliku: 0 = OK, -1 = BŁĄD. */
int board_import(Board** b, const char* filename,
                  int isCircleComputer, int isCrossComputer);

/* zapis stanu gry do pliku: 0 = OK, -1 = BŁĄD. */
int board_export(Board* b, const char* filename);

/***********************************
 * OPERACJE WYKONYWANIA ZAGRAŃ     *
 * NA PLANSZY GRY...               *
 ***********************************/

/* wykonaj ruch na pozycji (x,y) */
void board_play(Board* b, int x, int y);

/* j.w. */
void board_play_move(Board* b, Move m);

/* pasujemy */
void board_pass(Board* b);

/* cofnij o 1 ruch wstecz */
void board_undo(Board* b);

/***************************************
 * ZMIANA STANU PLANSZY BEZ STOSU UNDO *
 * ORAZ ZMIANY NIEBĘDĄCE ZAGRANIAMI    *
 ***************************************/

/* ustawienie pola bez stosu undo */
void board_set(Board* b, int x, int y, symbol s);

/* ustawienie bieżącego gracza */
void board_set_current_player_symbol(Board* b, symbol s);

/* zmiana kary za grupę */
void board_set_penalty(Board* b, int penalty);

/* zmiana punktów z licytacji dla krzyżyka */
void board_set_cross_bidding_points(Board* b, float f);

/* zmiana człowiek <-> komputer na kółku */
void board_set_circle_computer(Board* b, int logical);

/* zmiana człowiek <-> komputer na krzyżyku */
void board_set_cross_computer(Board* b, int logical);

/************************************
 * OPERACJE POBIERAJĄCE INFORMACJE  *
 * O STANIE GRY...                  *
 ************************************/

/* czy ruch jest dozwolony? */
int board_is_move_allowed(Board* b, int x, int y);

/* pobierz liczbę dozwolonych ruchów */
int board_get_allowed_moves_count(Board* b);

/* pobierz dozwolone ruchy, należy zwolnić pamięć tablicy */
Move* board_get_allowed_moves(Board* b);

/* do kogo należy bieżący ruch? */
symbol board_get_current_player_symbol(Board* b);

/* czy bieżący ruch należy do człowieka? */
int board_is_current_move_human(Board* b);

/* czy trwa gra komputer - komputer? */
int board_is_computer_vs_computer(Board* b);

/* czy już koniec gry? */
int board_is_game_finished(Board* b);

/* pobierz symbol na pozycji (x,y) */
symbol board_get(Board* b, int x, int y);

/* pobierz rozmiar planszy (długość boku) */
int board_size(Board* b);

/* pobierz wysokość kary za grupę */
int board_get_penalty(Board* b);

/* pobierz punkty z licytacji (dla krzyżyka) */
float board_get_cross_bidding_points(Board* b);

/* aktualny wynik */
Result board_result(Board* b);

#endif